package com.ungs.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

import com.ungs.dao.StockMaterialDAO;
import com.ungs.entities.OrdenTrabajo;
import com.ungs.entities.StockMaterial;
import com.ungs.filter.StockMaterialFilter;

public class StockMaterialDAOImpl extends EntidadDAOImpl<StockMaterial>
		implements StockMaterialDAO {

	@SuppressWarnings("unchecked")
	@Override
	public List<StockMaterial> getStockByFilter(
			StockMaterialFilter stockMaterialFilter) throws HibernateException {
		List<StockMaterial> stockMaterialList = new ArrayList<StockMaterial>();

		Criteria criteria = null;
		Criteria critCalidad = null;
		Criteria critVariante = null;
		Criteria critFormatoPapel = null;
		Criteria critOrdenTrabajo = null;
		Criteria critSolicitudCompra = null;

		logger.info("Obteniendo el stock por filtro");
		try {
			iniciaConexion();
			criteria = getSession().createCriteria(StockMaterial.class);

			if (!stockMaterialFilter.getMarca().trim().isEmpty()) {
				criteria.add(Restrictions.like("marca", "%"
						+ stockMaterialFilter.getMarca() + "%"));
			}

			if (!stockMaterialFilter.getNumOrdenTrabajo().trim().isEmpty()) {
				critOrdenTrabajo = criteria.createCriteria("ordenTrabajo");
				critOrdenTrabajo.add(Restrictions.eq("numIdentificatorio",
						stockMaterialFilter.getNumOrdenTrabajo()));
			}

			if (!stockMaterialFilter.getNumSolicitudCompra().trim().isEmpty()) {
				critSolicitudCompra = criteria
						.createCriteria("solicitudCompra");
				critSolicitudCompra.add(Restrictions.eq("codigo",
						stockMaterialFilter.getNumSolicitudCompra()));
			}

			if (stockMaterialFilter.getCalidad() != null) {
				critCalidad = criteria.createCriteria("calidad");
				critCalidad.add(Restrictions.eq("id", stockMaterialFilter
						.getCalidad().getId()));
			}

			if (stockMaterialFilter.getVariante() != null) {
				critVariante = criteria.createCriteria("variante");
				critVariante.add(Restrictions.like("id", stockMaterialFilter
						.getVariante().getId()));
			}

			if (stockMaterialFilter.getFormatoPapel() != null) {
				critFormatoPapel = criteria.createCriteria("formatoPapel");
				critFormatoPapel.add(Restrictions.like("id",
						stockMaterialFilter.getFormatoPapel().getId()));
			}

			if (stockMaterialFilter.getGramaje() > 0) {
				criteria.add(Restrictions.eq("gramaje",
						+stockMaterialFilter.getGramaje()));
			}

			stockMaterialList = (List<StockMaterial>) criteria.list();

		} catch (HibernateException he) {
			logger.error("Error al obtener el stock por filtro: "
					+ StockMaterial.class + "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}

		return stockMaterialList;
	}

	@Override
	public StockMaterial getStockMaterial(StockMaterial stockMaterial)
			throws HibernateException {
		StockMaterial stockMaterialReturn = null;

		logger.info("Obteniendo el stock");
		try {
			iniciaConexion();
			Long idCalidad = stockMaterial.getCalidad().getId();
			Long idVariante = stockMaterial.getVariante().getId();
			Long idFormatoPapel = stockMaterial.getFormatoPapel().getId();

			Criteria criteria = null;
			Criteria critCalidad = null;
			Criteria critVariante = null;
			Criteria critFormatoPapel = null;

			criteria = getSession().createCriteria(StockMaterial.class);
			critCalidad = criteria.createCriteria("calidad");
			critVariante = criteria.createCriteria("variante");
			critFormatoPapel = criteria.createCriteria("formatoPapel");

			critCalidad.add(Restrictions.eq("id", idCalidad));
			critVariante.add(Restrictions.eq("id", idVariante));
			critFormatoPapel.add(Restrictions.eq("id", idFormatoPapel));
			criteria.add(Restrictions.eq("gramaje", stockMaterial.getGramaje()));
			criteria.add(Restrictions.eq("marca", stockMaterial.getMarca()));
			criteria.add(Restrictions.isNull("solicitudCompra"));
			criteria.add(Restrictions.isNull("ordenTrabajo"));

			stockMaterialReturn = (StockMaterial) criteria.uniqueResult();

		} catch (HibernateException he) {
			logger.error("Error al obtener el stock: " + StockMaterial.class
					+ "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}

		return stockMaterialReturn;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<StockMaterial> getStockByOrdenTrabajo(OrdenTrabajo ordenTrabajo)
			throws HibernateException {
		List<StockMaterial> stockMaterialList = new ArrayList<StockMaterial>();

		logger.info("Obteniendo stock por OT");
		try {
			iniciaConexion();
			Criteria criteria = getSession()
					.createCriteria(StockMaterial.class);
			Criteria critOT = criteria.createCriteria("ordenTrabajo");

			critOT.add(Restrictions.eq("id", ordenTrabajo.getId()));

			stockMaterialList = (List<StockMaterial>) criteria.list();

		} catch (HibernateException he) {
			logger.error("Error al obtener el stock por OT: "
					+ StockMaterial.class + "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}
		return stockMaterialList;
	}

}
